package run.halo.app.plugins.elastic.dsl;

import cn.hutool.core.util.ClassUtil;
import cn.hutool.extra.template.TemplateEngine;
import cn.hutool.extra.template.engine.freemarker.FreemarkerEngine;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.MruCacheStorage;
import freemarker.template.Configuration;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;

/**
 * freemarker dsl parse
 *
 * @author 周鹏程
 * @date 2022/08/14
 */
public class FreemarkerDslParse implements DslParse {

    /**
     * 模板引擎
     */
    private final TemplateEngine templateEngine;

    /**
     * dsl 模板所在路径
     */
    private static final String DSL_FREEMARKER_PATH = "elasticsearch/dsl";
    /**
     * 强引用缓存模板数量
     */
    private static final Integer FREEMARKER_CACHE_STRONG_SIZE = 30;

    /**
     * 软引用缓存模板数量
     */
    private static final Integer FREEMARKER_CACHE_SOFT_SIZE = 200;

    /**
     * 初始化模板引擎
     */
    public FreemarkerDslParse(){
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
        cfg.setLocalizedLookup(false);
        cfg.setDefaultEncoding(StandardCharsets.UTF_8.displayName());
        cfg.setTemplateLoader(new ClassTemplateLoader(ClassUtil.getClassLoader(), DSL_FREEMARKER_PATH));
        //设置数字格式化模式
        cfg.setNumberFormat("#");
        //设置日期格式化模式
        cfg.setDateFormat("yyyy-MM-dd");
        cfg.setTimeFormat("HH:mm:ss");
        cfg.setDateTimeFormat("yyyy-MM-dd HH:mm:ss");
        //设置缓存
        cfg.setCacheStorage(new MruCacheStorage(FREEMARKER_CACHE_STRONG_SIZE, FREEMARKER_CACHE_SOFT_SIZE));

        templateEngine = new FreemarkerEngine(cfg);
    }

    @Override
    public String parse(String dslQueryName, Map<String, Object> param) {
        if(StringUtils.isEmpty(dslQueryName)){
            return null;
        }
        return templateEngine.getTemplate(dslQueryName).render(param);
    }
}
